From bf5f27c6d5c6a07965ecded380510e7565705e66 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 15 Jul 2018 20:11:56 -0400 Subject: [PATCH] Handle configure events in gdk The previous attempt at removing configure events entirely was causing some dialogs not to show up under Wayland. Presumably due to ordering issues with emitting ::size-change out of the backend. Instead, keep configure events in the event queue, but handle them on the gdk side. This keeps the ordering intact, while still removing configure events from the api. The dialogs show up now. --- gdk/gdkevents.c | 3 +++ gdk/gdkinternals.h | 2 ++ gdk/gdksurface.c | 13 +++++++++++++ gtk/gtkmain.c | 11 ----------- gtk/gtkwindow.c | 4 ++++ 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c index 02c61f389a..b25d27b366 100644 --- a/gdk/gdkevents.c +++ b/gdk/gdkevents.c @@ -168,6 +168,9 @@ _gdk_event_emit (GdkEvent *event) if (gdk_drag_handle_source_event (event)) return; + if (gdk_surface_handle_event (event)) + return; + if (_gdk_event_func) (*_gdk_event_func) (event, _gdk_event_data); } diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index 69b5f844f1..f64f38dd4b 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -291,6 +291,8 @@ GdkGLContext * gdk_surface_get_paint_gl_context (GdkSurface *surface, void gdk_surface_get_unscaled_size (GdkSurface *surface, int *unscaled_width, int *unscaled_height); +gboolean gdk_surface_handle_event (GdkEvent *event); + /***************************************** * Interfaces provided by windowing code * diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c index 7140f9c251..9b7b0a2228 100644 --- a/gdk/gdksurface.c +++ b/gdk/gdksurface.c @@ -5486,3 +5486,16 @@ gdk_synthesize_surface_state (GdkSurface *surface, { gdk_surface_set_state (surface, (surface->state | set_flags) & ~unset_flags); } + +gboolean +gdk_surface_handle_event (GdkEvent *event) +{ + if (gdk_event_get_event_type (event) == GDK_CONFIGURE) + { + g_signal_emit (gdk_event_get_surface (event), signals[SIZE_CHANGED], 0, + event->configure.width, event->configure.height); + return TRUE; + } + + return FALSE; +} diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 5d4b71935e..d92523a90d 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1827,17 +1827,6 @@ gtk_main_do_event (GdkEvent *event) } break; - case GDK_CONFIGURE: - if (GTK_IS_WINDOW (event_widget) && - _gtk_widget_get_surface (event_widget) == event->any.surface) - { - gtk_window_configure (GTK_WINDOW (event_widget), - event->configure.width, - event->configure.height); - } - - break; - case GDK_FOCUS_CHANGE: case GDK_GRAB_BROKEN: if (!_gtk_widget_captured_event (event_widget, event)) diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 392d4ab268..295fbacee1 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -6869,6 +6869,7 @@ gtk_window_realize (GtkWidget *widget) gtk_widget_set_surface (widget, surface); g_signal_connect_swapped (surface, "notify::state", G_CALLBACK (surface_state_changed), widget); + g_signal_connect_swapped (surface, "size-changed", G_CALLBACK (gtk_window_configure), widget); gtk_widget_register_surface (widget, surface); GTK_WIDGET_CLASS (gtk_window_parent_class)->realize (widget); @@ -7007,6 +7008,9 @@ gtk_window_unrealize (GtkWidget *widget) g_signal_handlers_disconnect_by_func (_gtk_widget_get_surface (widget), G_CALLBACK (surface_state_changed), widget); + g_signal_handlers_disconnect_by_func (_gtk_widget_get_surface (widget), + G_CALLBACK (gtk_window_configure), + widget); GTK_WIDGET_CLASS (gtk_window_parent_class)->unrealize (widget); -- 2.30.2